package net.esj.basic.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.esj.alipay.util.AlipayNotify;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class AlipayServlet extends HttpServlet {
	
	private String out_trade_no;
	private String trade_no;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("开始--------------------------------");
		
		ServletContext servletContext = this.getServletContext();
		WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
		PrintWriter out = resp.getWriter();
		try {
			Map<String, String> params = new HashMap<String, String>();
			Map requestParams = req.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				// = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
				params.put(name, valueStr);
			}

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			// 商户订单号

			out_trade_no = new String(req.getParameter("out_trade_no")
					.getBytes("ISO-8859-1"), "UTF-8");
			// 支付宝交易号
			trade_no = new String(req.getParameter("trade_no").getBytes(
					"ISO-8859-1"), "UTF-8");
			// 交易状态
			String trade_status = new String(req.getParameter("trade_status")
					.getBytes("ISO-8859-1"), "UTF-8");
			
			
			System.out.println(trade_status);
			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

			if (AlipayNotify.verify(params)) {// 验证成功
				// ////////////////////////////////////////////////////////////////////////////////////////
				// 请在这里加上商户的业务逻辑程序代码
				// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				switch (trade_status) {
					case "WAIT_BUYER_PAY":
						//System.out.println("交易创建，等待买家付款");
						break;
					case "TRADE_CLOSED":
						//System.out.println("在指定时间段内未支付时关闭的交易;在交易完成全额退款成功时关闭的交易");
						//查询订单状态，如果订单状态不为2，则将其删除,且将相应优惠券返还
						//orderManage.alipayTradeClosed(out_trade_no,"在指定时间段内未支付");
						//System.out.println("TRADE_CLOSED关闭交易 ");
						break;
					case "TRADE_SUCCESS":
						// 判断该笔订单是否在商户网站中已经做过处理
						// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						// 如果有做过处理，不执行商户的业务程序

						// 注意：
						// 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
						System.out.println("TRADE_SUCCESS交易成功，且可对该交易做操作，如：多级分润、退款等 ");
						break;
					case "TRADE_PENDING":
						//System.out.println("等待卖家收款（买家付款后，如果卖家账号被冻结）。");
						break;
					case "TRADE_FINISHED":
						// 判断该笔订单是否在商户网站中已经做过处理
						// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						// 如果有做过处理，不执行商户的业务程序
						
						// 注意：
						// 该种交易状态只在两种情况下出现
						// 1、开通了普通即时到账，买家付款成功后。
						// 2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
						
						//System.out.println("TRADE_FINISHED交易成功且结束 ");
						break;
					default:
							break;
				}

				// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				
				out.println("success"); // 请不要修改或删除
				//System.out.println("alipay//////////////////////////////////////////////////验证成功success ");
				// ////////////////////////////////////////////////////////////////////////////////////////
			} else {// 验证失败
				out.println("fail");
				//System.out.println("alipay//////////////////////////////////////////////////验证失败fail");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				out.close();
			}
		}
	}

}
